
#include "lireFichier.h"
#include <malloc.h>

FILE * fichierInit(const char * nomFichier)
{
	FILE * fic;
	fic = fopen(nomFichier, "r");
	if(fic == NULL)
	{
		printf("Erreur ouverture fichier %s\n", nomFichier);
		return NULL;
	}
	else
	{
		return fic;
	}
}

int nbLigne(FILE *fic)
{
    char *temp = malloc(sizeof(char)*128);
	int nbrLigne = 0;
	while(!feof(fic)) /*La boucle lit les caractÃ¨res du fichier un par un, jusqu'Ã  la fin du fichier (End Of File).*/
	{
		fgets(temp,128,fic);
		nbrLigne++;
	}
    free(temp);
	return nbrLigne;
}

void suppLigneVide( char * nomFichier)
{
    FILE * fIn;
    FILE * fOut;
    char ligne[512];
    if ((fIn = fopen(nomFichier, "r")) == NULL)
    {
        printf("Impossible d'ouvrir le fichier");
    }
    else if ((fOut = fopen("texte.tmp", "w+")) == NULL)
    {
        fclose(fIn);
        printf("Impossible de creer le fichier temporaire");
    }
    else
    {
        while (fgets(ligne, 512, fIn))
        {
            if (ligne[0] != '\n')
            {
                fputs(ligne, fOut);
            }
        }
        fclose(fIn);
        fclose(fOut);
        rename("texte.tmp", nomFichier);
    }
}
void lireLigne(FILE * texte, const int num, char * ligne)
{
    int i, d, f, t;
	/**Repositionnement du curseur au debut du fichier*/
	rewind(texte);
	t = nbLigne(texte);
        rewind(texte);
	if(num > t)
	{
		printf("Erreur : numero de ligne trop grand");
	}
	else
	{
        d = posDebutLigne(texte,num);
        f = posFinLigne(texte,num);
        for( i=d ; i<=f ; i++)
        {
            ligne[i-d] = caractereFichierNum(texte, i);
        }
        ligne[f-d+1] = '\0';
	}
}
int posDebutLigne(FILE * fic, const int num)
{
        int i, t;
	char caractereActuel;
	rewind(fic);/*Repositionnement du curseur au dÃ©but du fichier*/
	t = nbLigne(fic);
	rewind(fic);
	if(num > t)
	{
		printf("Erreur : numéro de ligne trop grand");
		return 0;
	}
	for ( i=1 ; i<num ; i++ )/*Boucle qui saute les lignes précedentes*/
	{
		do
        {
            caractereActuel = fgetc(fic); /*On lit le caractÃ¨re*/
        } while (caractereActuel != '\n');
	}
	return ftell(fic);/*Renvoie la position du curseur*/
}

int posFinLigne(FILE * fic, const int num)
{
    int i, t;
    long int K, J = -2;
	char caractereActuel;
	rewind(fic);/*Repositionnement du curseur au dÃ©but du fichier*/
	t = nbLigne(fic);
    rewind(fic);
	if(num > t)
	{
		printf("Erreur : numÃ©ro de ligne trop grand");
		return 0;
	}
	for ( i=0 ; i<num ; i++ )/*Boucle qui saute les lignes prÃ©cedentes*/
	{
		do
        {
            caractereActuel = fgetc(fic); /*On lit le caractÃ¨re*/
        } while (caractereActuel != '\n');
	}
	K = J +  ftell(fic);
	return K;

}

char caractereFichierNum(FILE * fic, const long int num)
{
    char caract;
    fseek(fic, num, SEEK_SET);
    caract = fgetc(fic);
    return caract;
}
